package com.ww.core.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import android.annotation.SuppressLint;

/**
 * 常用关于时间的工具.
 * 比如格式化时间等.
 * @since jdk1.5
 * @version 2012-3-5
 
 */
@SuppressLint("SimpleDateFormat")
public class TimeUtils {
	private static final int DAY = 1440;

	/**
	 * 比较两天之间相差的周数.
	 * @param dateFromStr  yyyy-MM-dd
	 * @param dateToStr  yyyy-MM-dd
	 * @return int
	 */
	public static int getWeeksBetweenDates(String dateFromStr, String dateToStr) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		Calendar dateFrom = Calendar.getInstance();
		Calendar dateTo = Calendar.getInstance();
		try {
			dateFrom.setTime(format.parse(dateFromStr));
			dateTo.setTime(format.parse(dateToStr));
		} catch (ParseException e) {
			Logger.error("比较两天之间相差的周数", e);
		}
		long intervalMilli = dateTo.getTimeInMillis() - dateFrom.getTimeInMillis();
		if (intervalMilli < 0) {
			throw new RuntimeException("开始时间不能小于结束时间");
		}
		long days = (intervalMilli / (24 * 60 * 60 * 1000));
		int intweeks = (int) days / 7;
		if (days % 7 > 0) {
			long dtime = dateTo.getTimeInMillis();
			dtime = dtime + intweeks * 7 * 24 * 60 * 60 * 1000;
			Calendar midDate = Calendar.getInstance();
			midDate.setTimeInMillis(dtime);
			int k = midDate.get(Calendar.DAY_OF_WEEK);
			if (k + days % 7 > 7) {
				intweeks += 1;
			}
		}
		return intweeks;
	}

	/**
	 * 获取指定日期所属月份有多少天.
	 * @param dateStr "yyyy-MM-dd"的格式
	 * @return kkk
	 */
	public static int getDaysOfMonth(String dateStr) {
		SimpleDateFormat formatYMD = new SimpleDateFormat("yyyy-MM-dd");
		String year = dateStr.split("-")[0];
		String month = dateStr.split("-")[1];
		String date = "01";
		Date d = null;
		try {
			d = formatYMD.parse(year + "-" + month + "-" + date);
		} catch (ParseException e) {
			Logger.error("获取指定日期所属月份有多少天", e);
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(d);
		return calendar.getActualMaximum(Calendar.DATE);
	}

	/**
	 * 获取今天星期几.
	 * @return 今天星期几 (int)
	 */
	public static int getNowWeek() {
		Calendar calendar = Calendar.getInstance();
		Date date = new Date();
		calendar.setTime(date);
		int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
		if (dayOfWeek < 0)
			dayOfWeek = 0;
		return dayOfWeek;
	}

	/**
	 * 获得指定日期所属月份的第一天是星期几.
	 * @param dateStr  日期
	 * @return int
	 */
	public static int getWeekDayForFirstdayOfMonth(String dateStr) {
		SimpleDateFormat formatYMD = new SimpleDateFormat("yyyy-MM-dd");
		String year = dateStr.split("-")[0];
		String month = dateStr.split("-")[1];
		String date = "01";
		Date d = null;
		try {
			d = formatYMD.parse(year + "-" + month + "-" + date);
		} catch (ParseException e) {
			Logger.error("获得指定日期所属月份的第一天是星期几", e);
		}
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(d);
		return calendar.get(Calendar.DAY_OF_WEEK);
	}

	/**
	 * 获取当天日期. 
	 * @return String(yyyy-mm-dd)
	 */
	public static String getToday() {
		Date now = new Date();
		String hehe = new SimpleDateFormat("yyyy-MM-dd").format(now);
		return hehe;
	}

	/**
	 * 格式化日期. 
	 * @param date  日期
	 * @return String(yyyy-mm-dd)
	 */
	public static String parseDate(Date date) {
		String hehe = new SimpleDateFormat("yyyy-MM-dd").format(date);
		return hehe;

	}

	/**
	 * 获取当前时间.
	 * @return String(yyyy-mm-dd HH:mm:ss)
	 */

	public static String getNowTime() {
		Date now = new Date();
		String hehe = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(now);
		return hehe;
	}

	/**
	 * 获得当前日期与本周日相差的天数.
	 * @return  int
	 */
	private int getMondayPlus() {
		Calendar cd = Calendar.getInstance();
		// 获得今天是一周的第几天，星期日是第一天，星期二是第二天......
		int dayOfWeek = cd.get(Calendar.DAY_OF_WEEK) - 1; // 因为按中国礼拜一作为第一天所以这里减1
		if (dayOfWeek == 1) {
			return 0;
		} else {
			return 1 - dayOfWeek;
		}
	}

	/**
	 * 获取当天周几.
	 * @return  星期N
	 */
	public static String getWeekToday() {
		int weekday = getWeekDayByToday();
		String week = "";
		switch (weekday) {
		case 7:
			week = "日";
			break;
		case 1:
			week = "一";
			break;
		case 2:
			week = "二";
			break;
		case 3:
			week = "三";
			break;
		case 4:
			week = "四";
			break;
		case 5:
			week = "五";
			break;
		case 6:
			week = "六";
			break;
		}
		return "星期" + week;

	}

	/**
	 * 根据日期获取 日期+星期.
	 * @param dateStr 制定日期
	 * @return "日期  周几"
	 */
	public static String getWeekDayByDate(String dateStr) {
		SimpleDateFormat formatYMD = new SimpleDateFormat("yyyy-MM-dd");// formatYMD表示的是yyyy-MM-dd格式
		Date d = null;
		String newdate = "";
		try {
			d = formatYMD.parse(dateStr);
			newdate = formatYMD.format(d);
		} catch (ParseException e) {
			Logger.error("根据日期获取 日期+星期", e);
		}
		// 将String 转换为符合格式的日期
		String[] weekDays = { "星期日 ", "星期一 ", "星期二 ", "星期三 ", "星期四 ", "星期五 ", "星期六 " };
		Calendar cal = Calendar.getInstance();
		cal.setTime(d);

		int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
		if (w < 0)
			w = 0;
		return newdate + " " + weekDays[w];
	}

	/**
	 * @param date  日期
	 * @return int
	 */
	public static int getWeekForWest(String date) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		Calendar c = Calendar.getInstance();
		try {
			c.setTime(format.parse(date));
		} catch (ParseException e) {
			Logger.error("getWeekForWest", e);
		}
		int dayForWeek = c.get(Calendar.DAY_OF_WEEK);
		return dayForWeek;
	}

	/**
	 * 根据日期获取当天周几.
	 * @param date  日期
	 * @return string
	 */
	public static int getWeek(String date) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		Calendar c = Calendar.getInstance();
		try {
			c.setTime(format.parse(date));
		} catch (ParseException e) {
			Logger.error("根据日期获取当天周几", e);
		}
		int dayForWeek = 0;
		if (c.get(Calendar.DAY_OF_WEEK) == 1) {
			dayForWeek = 7;
		} else {
			dayForWeek = c.get(Calendar.DAY_OF_WEEK) - 1;
		}
		return dayForWeek;
	}

	/**
	 * 今天周几.
	 * @return int
	 */
	public static int getWeekDayByToday() {
		Calendar cld = Calendar.getInstance();
		return cld.get(Calendar.DAY_OF_WEEK) - 1;
	}

	/**
	 * @param weekday  数字周几
	 * @return 汉字（一，二，三，四，五，六，日）
	 */
	public static String getWeekDayInt2Str(int weekday) {
		String week = "";
		switch (weekday) {
		case 7:
			week = "日";
			break;
		case 1:
			week = "一";
			break;
		case 2:
			week = "二";
			break;
		case 3:
			week = "三";
			break;
		case 4:
			week = "四";
			break;
		case 5:
			week = "五";
			break;
		case 6:
			week = "六";
			break;
		}
		return "星期" + week;
	}

	/**
	 * 格式化日期.
	 * @param dateTime  日期
	 * @return 格式化后的日期
	 */
	public static String formatDateTime(String dateTime) {
		SimpleDateFormat formatYMD = new SimpleDateFormat("yyyy-MM-dd");// formatYMD表示的是yyyy-MM-dd格式
		Date d = null;
		try {
			d = formatYMD.parse(dateTime);
		} catch (ParseException e) {
			Logger.error("格式化日期", e);
		}
		return formatYMD.format(d);
	}

	/**
	 * 格式化日期.
	 * @param dateTime 日期 yyyy-MM-dd HH:mm
	 * @return 格式化后的日期 HH:mm
	 */
	public static String getTimeByDateTime(String dateTime) {
		SimpleDateFormat formatYMD = new SimpleDateFormat("yyyy-MM-dd HH:mm");// formatYMD表示的是yyyy-MM-dd格式
		SimpleDateFormat formatYMD1 = new SimpleDateFormat("HH:mm");// formatYMD表示的是yyyy-MM-dd格式
		Date d = null;
		try {
			d = formatYMD.parse(dateTime);
		} catch (ParseException e) {
			Logger.error("格式化日期", e);
		}
		return formatYMD1.format(d);
	}

	/**
	 * 判断时间先后.
	 * @param startTime   日期
	 * @param endTime  日期
	 * @return 是或否
	 */
	public static boolean comparedDate(String startTime, String endTime) {
		SimpleDateFormat formatYMD = new SimpleDateFormat("yyyy-MM-dd");// formatYMD表示的是yyyy-MM-dd格式
		Date d1 = null;
		Date d2 = null;
		boolean bool = true;
		try {
			d1 = formatYMD.parse(startTime);
			d2 = formatYMD.parse(endTime);
			if (d1.before(d2)) {
				bool = true;
			} else if (d1.after(d2)) {
				bool = false;
			}
		} catch (ParseException e) {
			Logger.error("判断时间先后", e);
		}
		return bool;
	}

	/**
	 * 判断时间先后.
	 * @param startTime   日期
	 * @param endTime  日期
	 * @return 是或否
	 */
	public static boolean comparedTime(String startTime, String endTime) {
		SimpleDateFormat formatYMD = new SimpleDateFormat("HH:mm");// formatYMD表示的是yyyy-MM-dd格式
		Date d1 = null;
		Date d2 = null;
		boolean bool = true;
		try {
			d1 = formatYMD.parse(startTime);
			d2 = formatYMD.parse(endTime);
			if (d1.before(d2)) {
				bool = true;
			} else if (d1.after(d2)) {
				bool = false;
			}
		} catch (ParseException e) {
			Logger.error("判断时间先后", e);
		}
		return bool;
	}

	/**
	 * 判断时间先后精确到秒.
	 * @param startTime  日期
	 * @param endTime 日期
	 * @return 是或否
	 */
	public static boolean comparedDateSS(String startTime, String endTime) {
		SimpleDateFormat formatYMD = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// formatYMD表示的是yyyy-MM-dd格式
		Date d1 = null;
		Date d2 = null;
		boolean bool = true;
		try {
			d1 = formatYMD.parse(startTime);
			d2 = formatYMD.parse(endTime);
			if (d1.before(d2)) {
				bool = true;
			} else if (d1.after(d2)) {
				bool = false;
			}
		} catch (ParseException e) {
			Logger.error("判断时间先后精确到秒", e);
		}
		return bool;
	}

	/**
	 * 判断时间先后精确到秒.
	 * @param date  日期
	 * @return 时间
	 */
	public static String dateTimeToStr(Date date) {
		SimpleDateFormat formatYMD = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// formatYMD表示的是yyyy-MM-dd格式
		String ret = null;
		try {
			ret = formatYMD.format(date);

		} catch (Exception e) {
			Logger.error("dateTimeToStr", e);
		}
		return ret;
	}

	/**
	 * 格式化日期精确到分.
	 * @param date  日期
	 * @return yyyy-MM-dd HH:mm
	 */
	public static String dateMinuteToStr(Date date) {
		SimpleDateFormat formatYMD = new SimpleDateFormat("yyyy-MM-dd HH:mm");// formatYMD表示的是yyyy-MM-dd格式
		String ret = null;
		try {
			ret = formatYMD.format(date);

		} catch (Exception e) {
			Logger.error("dateTimeToStr", e);
		}
		return ret;
	}

	/**
	 * 判断某一时间是否在时间段内.
	 * @param formatYMD  时间格式
	 * @param midTime 开始时间
	 * @param startTime 中间时间
	 * @param endTime  结束时间
	 * @return 是或否
	 */
	public static boolean comparedBetween(SimpleDateFormat formatYMD, String midTime, String startTime, String endTime) {
		Date start = null;
		Date mid = null;
		Date end = null;
		boolean bool = true;
		try {
			start = formatYMD.parse(startTime);
			mid = formatYMD.parse(midTime);
			end = formatYMD.parse(endTime);
			if (mid.before(end) && mid.after(start)) {
				bool = true;
			} else {
				bool = false;
			}
		} catch (ParseException e) {
			Logger.error("判断某一时间是否在时间段内", e);
		}
		return bool;
	}

	/**
	 * 获得本周一的日期.
	 * @return 本周一的日期
	 */
	public String getMondayOFWeek() {
		int mondayPlus = this.getMondayPlus();
		GregorianCalendar currentDate = new GregorianCalendar();
		currentDate.add(GregorianCalendar.DATE, mondayPlus);
		Date monday = currentDate.getTime();
		DateFormat df = DateFormat.getDateInstance();
		String preMonday = df.format(monday);
		return preMonday;
	}

	/**
	 * 获得本周日的日期.
	 * @return 本周日的日期
	 */
	public String getCurrentWeekday() {
		int mondayPlus = this.getMondayPlus();
		GregorianCalendar currentDate = new GregorianCalendar();
		currentDate.add(GregorianCalendar.DATE, mondayPlus + 6);
		Date monday = currentDate.getTime();
		DateFormat df = DateFormat.getDateInstance();
		String preMonday = df.format(monday);
		return preMonday;
	}

	/**
	 * 当前年份.
	 * @return  yyyy
	 */
	public static String getNowyear() {
		SimpleDateFormat formatYMD = new SimpleDateFormat("yyyy");
		Date now = new Date();
		String hehe = formatYMD.format(now);
		return hehe;
	}

	/**
	 * 当前月份.
	 * @return  yyyy-MM
	 */
	public static String getNowMonth() {
		SimpleDateFormat formatYMD = new SimpleDateFormat("yyyy-MM");
		Date now = new Date();
		String hehe = formatYMD.format(now);
		return hehe;
	}

	/**
	 * 当前月的前n月.
	 * @param n 推前月份数
	 * @return 月份
	 */
	public static String getBeforeMonth(int n) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MONTH, -n);
		String haha = sdf.format(calendar.getTime());
		return haha;
	}

	/**
	 * 当前月的后n月.
	 * @param n 推后月份数
	 * @return 月份
	 */
	public static String getAfterMonth(int n) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MONTH, n);
		String haha = sdf.format(calendar.getTime());
		return haha;
	}

	/**
	 * 当前月份.
	 * @return 当前月份： MM
	 */
	public static String getNowSimpleMonth() {
		SimpleDateFormat formatYMD = new SimpleDateFormat("MM");
		Date now = new Date();
		String hehe = formatYMD.format(now);
		return hehe;
	}

	/**
	 * 当前月份.
	 * @return 当前月份： MM
	 */
	public static String getNowSimpleMonth2() {
		SimpleDateFormat formatYMD = new SimpleDateFormat("MM");
		Date now = new Date();
		String hehe = formatYMD.format(now);
		if (hehe.contains("0")) {
			hehe.replace("0", "");
		}
		return hehe;
	}

	/**
	 * 当前日期.
	 * @return 当前日期： dd
	 */
	public static String getNowSimpleDay() {
		SimpleDateFormat formatYMD = new SimpleDateFormat("dd");
		Date now = new Date();
		String hehe = formatYMD.format(now);
		return hehe;
	}

	/**
	 * 
	 * @param specifiedDay    某天
	 * @return 某天的前一天
	 */
	public static String getDayBefore(String specifiedDay) {
		Calendar c = Calendar.getInstance();
		Date date = null;
		try {
			date = new SimpleDateFormat("yy-MM-dd").parse(specifiedDay);
		} catch (Exception e) {
			Logger.error("某天的前一天", e);
		}
		c.setTime(date);
		int day = c.get(Calendar.DATE);
		c.set(Calendar.DATE, day - 1);
		String dayBefore = new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
		return dayBefore;
	}

	/**
	 * 
	 * @param specifiedDay  某天
	 * @return 某天的后一天
	 */
	public static String getDayNext(String specifiedDay) {
		Calendar c = Calendar.getInstance();
		Date date = null;
		try {
			date = new SimpleDateFormat("yy-MM-dd").parse(specifiedDay);
		} catch (Exception e) {
			Logger.error("某天的后一天", e);
		}
		c.setTime(date);
		int day = c.get(Calendar.DATE);
		c.set(Calendar.DATE, day + 1);
		String dayBefore = new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
		return dayBefore;
	}

	/**
	 * 获取摩天退后几天的日期.
	 * @param specifiedDay  某天
	 * @param days  后几天
	 * @return 日期 yy-MM-dd
	 */
	public static String getDayAfter(String specifiedDay, int days) {
		Calendar c = Calendar.getInstance();
		Date date = null;
		try {
			date = new SimpleDateFormat("yy-MM-dd").parse(specifiedDay);
		} catch (Exception e) {
			Logger.error("某天的后一天", e);
		}
		c.setTime(date);
		int day = c.get(Calendar.DATE);
		c.set(Calendar.DATE, day + days);
		String dayBefore = new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
		return dayBefore;
	}

	/**
	 * 
	 * @param specifiedDay  某月
	 * @return 某天的前一月
	 */
	public static String getMonthBefore(String specifiedDay) {
		Calendar c = Calendar.getInstance();
		Date date = null;
		try {
			date = new SimpleDateFormat("yy-MM").parse(specifiedDay);
		} catch (Exception e) {
			Logger.error("某天的前一月", e);
		}
		c.setTime(date);
		int day = c.get(Calendar.MONTH);
		c.set(Calendar.MONTH, day - 1);
		String dayBefore = new SimpleDateFormat("yyyy-MM").format(c.getTime());
		return dayBefore;
	}

	/**
	 * 
	 * @param specifiedDay  某月
	 * @return 某天的后一月
	 */
	public static String getMonthNext(String specifiedDay) {
		Calendar c = Calendar.getInstance();
		Date date = null;
		try {
			date = new SimpleDateFormat("yy-MM").parse(specifiedDay);
		} catch (Exception e) {
			Logger.error("某天的后一月", e);
		}
		c.setTime(date);
		int day = c.get(Calendar.MONTH);
		c.set(Calendar.MONTH, day + 1);

		String dayBefore = new SimpleDateFormat("yyyy-MM").format(c.getTime());
		return dayBefore;
	}

	/**
	 * 获取该天所在周的周一和周日日期.
	 * @param t  某天
	 * @return 该天所在周的周一和周日日期
	 */
	public static String convertWeekByDate(String t) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // 设置时间格式
		Date time = null;
		try {
			time = sdf.parse(t);
		} catch (ParseException e) {
			Logger.error("获取该天所在周的周一和周日日期", e);
		}
		Calendar cal = Calendar.getInstance();
		cal.setTime(time);
		// 判断要计算的日期是否是周日，如果是则减一天计算周六的，否则会出问题，计算到下一周去了
		int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天
		if (1 == dayWeek) {
			cal.add(Calendar.DAY_OF_MONTH, -1);
		}
		cal.setFirstDayOfWeek(Calendar.MONDAY); // 设置一个星期的第一天，按中国的习惯一个星期的第一天是星期一
		int day = cal.get(Calendar.DAY_OF_WEEK); // 获得当前日期是一个星期的第几天
		cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);// 根据日历的规则，给当前日期减去星期几与一个星期第一天的差值
		String imptimeBegin = sdf.format(cal.getTime());
		cal.add(Calendar.DATE, 6);
		String imptimeEnd = sdf.format(cal.getTime());
		return imptimeBegin + "~" + imptimeEnd;
	}

	/**
	 * 
	 * @param time  时间
	 * @param format  格式
	 * @return 格式后的时间
	 */
	public static String getFormatTime(String time, SimpleDateFormat format) {
		Date d = null;
		SimpleDateFormat formatYMD = new SimpleDateFormat("yyyy-MM-dd HH:mm");// formatYMD表示的是yyyy-MM-dd格式
		try {
			d = format.parse(time);
		} catch (ParseException e) {
			Logger.error("getFormatTime", e);
		}
		return formatYMD.format(d);
	}

	/**
	 * 
	 * @param time     时间
	 * @return 格式后的时间
	 */
	public static String getFormatTime(String time) {
		Date d = null;
		SimpleDateFormat formatYMD = new SimpleDateFormat("yyyy-MM-dd HH:mm");// formatYMD表示的是yyyy-MM-dd格式
		try {
			d = formatYMD.parse(time);
		} catch (ParseException e) {
			Logger.error("getFormatTime", e);
		}
		return formatYMD.format(d);
	}

	/**
	 * 
	 * @param time  时间 yyyy-MM-dd
	 * @param format 格式
	 * @return 格式后的时间 HH:mm
	 */
	public static String[] getFormatTime2(String time, SimpleDateFormat format) {
		Date d = null;
		String[] res = new String[2];
		SimpleDateFormat formatYMD1 = new SimpleDateFormat("yyyy-MM-dd");// formatYMD表示的是yyyy-MM-dd格式
		SimpleDateFormat formatYMD2 = new SimpleDateFormat("HH:mm"); // formatYMD表示的是yyyy-MM-dd格式
		try {
			d = format.parse(time);
		} catch (ParseException e) {
			Logger.error("getFormatTime2", e);
		}

		res[0] = formatYMD1.format(d);
		res[1] = formatYMD2.format(d);
		return res;
	}

	/**
	 * 
	 * @param time  时间
	 * @return 格式后的时间
	 */
	public static String getFormatTime3(String time) {
		Date d = null;
		SimpleDateFormat formatYMD = new SimpleDateFormat("yyyy-MM-dd HH:mm");// formatYMD表示的是yyyy-MM-dd格式
		try {
			d = formatYMD.parse(time);
		} catch (ParseException e) {
			Logger.error("getFormatTime3", e);
		}
		return formatYMD.format(d);
	}

	/**
	 * 格式化时间.
	 * @param time  时间
	 * @param fromFormat  格式
	 * @param toFormat   格式后的时间
	 * @return 格式化时间
	 */
	public static String format(String time, String fromFormat, String toFormat) {
		Date d = null;
		try {
			d = new SimpleDateFormat(fromFormat).parse(time);
		} catch (ParseException e) {
			Logger.error("getFormatTime", e);
		}
		return new SimpleDateFormat(toFormat).format(d);
	}

	/**
	 * 获取当前学期.
	 * @return 当前学期
	 */
	public static int getNowSemester() {
		int month = Integer.parseInt(getNowSimpleMonth());
		int year = Integer.parseInt(getNowyear());
		int semester = 2;
		if (month > 8) {
			semester = 1;
		} else {
			year--;
		}
		return year * 10 + semester;
	}

	/**
	 * 将date格式化为string.
	 * @param date  日期
	 * @param format  格式
	 * @return string
	 */
	public static String getFormatStringByDate(Date date, SimpleDateFormat format) {
		if (date == null || format == null) {
			return "";
		}
		synchronized (format) {
			return format.format(date);
		}
	}

	/**
	 * 将String格式化(yyyy-MM-dd)为Date.
	 * @param date  日期
	 * @return Date
	 */
	public static Date stringToDate(String date) {
		if (date == null) {
			return null;
		}
		SimpleDateFormat formatYMD = new SimpleDateFormat("yyyy-MM-dd");// formatYMD表示的是yyyy-MM-dd格式
		try {
			return formatYMD.parse(date);
		} catch (Exception e) {
			Logger.error("getFormatString", e);
			return null;
		}
	}

	/**
	 * 将Date格式化(yyyy-MM-dd)为String.
	 * @param date  日期
	 * @return String
	 */
	public static String getFormatStringByDate(Date date) {
		if (date == null) {
			return "";
		}
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		return format.format(date);
	}

	/**
	 * 将String转换为date.
	 * @param date  被转换的字符串
	 * @param format 转换格式
	 * @return Date类型
	 */
	public static Date stringConvertToDateByfomrat(String date, SimpleDateFormat format) {
		if (date == null || format == null) {
			return null;
		}
		synchronized (format) {
			try {
				return format.parse(date);
			} catch (ParseException e) {
				Logger.error("String转换为date", e);
			}
		}
		return null;
	}

	/**
	 * 计算两日期之间相差的天数.
	 * @param startTime     开始时间
	 * @param endTime  结束时间
	 * @return 返回相差天数.
	 */
	public static long getDaysBetween(final String startTime, final String endTime) {
		long days = 0;
		Calendar start = Calendar.getInstance();
		Calendar end = Calendar.getInstance();
		Date timeStart;
		try {
			timeStart = millisToDate(startTime);
			Date timeEnd = millisToDate(endTime);
			start.setTime(timeStart);
			end.setTime(timeEnd);
		} catch (Exception e) {
			Logger.error("计算两日期之间相差的天数", e);
		}
		days = (end.getTimeInMillis() - start.getTimeInMillis()) / (24 * 60 * 60 * 1000);
		return days;
	}

	/**
	 * 计算两日期之间相差的天数.
	 * @param timeStart     开始日期
	 * @param timeEnd  结束日期
	 * @return 返回相差天数.
	 */
	public static long getDaysBetween(final Date timeStart, final Date timeEnd) {
		long days = 0;
		Calendar start = Calendar.getInstance();
		Calendar end = Calendar.getInstance();
		try {
			start.setTime(timeStart);
			end.setTime(timeEnd);
		} catch (Exception e) {
			Logger.error("计算两日期之间相差的天数", e);
		}
		days = (end.getTimeInMillis() - start.getTimeInMillis()) / (24 * 60 * 60 * 1000);
		Logger.error("计算两日期之间相差的天数" + days);
		return days;
	}

	/**
	 * 将毫秒转换为日期.
	 * @param millis 毫秒
	 * @return 日期
	 * @throws Exception Exception
	 */
	public static Date millisToDate(String millis) throws Exception {
		if (millis.contains("-")) {
			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
			return format.parse(millis);
		} else {
			Calendar c = Calendar.getInstance();
			c.setTimeInMillis(Long.parseLong(millis));
			return c.getTime();
		}
	}

	/**
	 * 将毫秒转换为日期.
	 * @param millis 毫秒
	 * @return 日期
	 * @throws Exception Exception
	 */
	public static String millisToDateStr(String millis) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
		if (millis.contains("-")) {
			try {
				return format.format(format.parse(millis));
			} catch (ParseException e) {
				e.printStackTrace();
				return "";
			}
		} else {
			Calendar c = Calendar.getInstance();
			c.setTimeInMillis(Long.parseLong(millis));
			return format.format(c.getTime());
		}
	}

	/**
	 * 时间处理.
	 * @param time 时间（long）
	 * @return String
	 */
	public static String getdays(long time) {
		String value = "";
		long newTime = new Date().getTime();
		long duration = (newTime - time) / (1000 * 60);
		if (duration < 1) {
			value = (newTime - time) / (1000) + "秒前";
		} else if (duration < 60) {
			value = duration + "分钟前";
		} else if (duration >= 60 && duration < DAY) {
			value = (duration / 60) + "小时前";
		} else if (duration >= DAY && duration < DAY * 2) {
			SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
			value = "昨天" + sdf.format(new Date(time));
		} else if (duration >= DAY * 2 && duration < DAY * 3) {
			SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
			value = "前天" + sdf.format(new Date(time));
		} else {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
			value = sdf.format(new Date(time));
		}
		return value;
	}


	/**
	 * 获取每个月的最后一天.
	 * @param time 时间
	 * @return yyyy-MM-dd
	 */
	public static String getLastDayOfMonth(String time) {
		Calendar ca = Calendar.getInstance();
		Date date = null;
		SimpleDateFormat sm = new SimpleDateFormat("yyyy-MM-dd");
		if (!StringUtils.isNotEmpty(time)) {
			date = new Date();
		} else {
			try {
				date = sm.parse(time);
			} catch (ParseException e) {
				e.printStackTrace();
			}
		}
		ca.setTime(date);
		final int lastDay = ca.getActualMaximum(Calendar.DAY_OF_MONTH);
		Date lastDate = ca.getTime();
		lastDate.setDate(lastDay);
		return sm.format(lastDate);
	}

	/**
	 * 获得当前月的最后一天.
	 * @param year   年
	 * @param month  月
	 * @return 最后一天
	 */
	public static int getLastMonthDay(int year, int month) {
		int lastmonth = 0;
		switch (month) {
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			lastmonth = 31;
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			lastmonth = 30;
			break;
		case 2:
			if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
				lastmonth = 29;
			else
				lastmonth = 28;
			break;
		}
		return lastmonth;
	}

	/**
	 * 根据日期获得星期几.
	 * 
	 * @param mCalendar
	 *            日期
	 * @return 星期几
	 */
	public static String getWeekOfDate(Calendar mCalendar) {
		String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };

		int currIndexDay = mCalendar.get(Calendar.DAY_OF_WEEK);
		return weekDays[currIndexDay - 1];
	}

	/**
	 * 功能:获取指定时间前后时间字符串.
	 * @param comPareTime 指定的时间
	 * @param day  时间差天数
	 * @param isBefore true 加几天 fase 减少几天 判断是前或者后
	 * @param patten  返回的时间格式
	 * @return 指定时间前后时间字符串
	 */
	public static String getDateByDay(String comPareTime, int day, boolean isBefore, SimpleDateFormat patten) {
		Calendar calendar = Calendar.getInstance();
		try {
			calendar.setTime(patten.parse(comPareTime));
			if (isBefore) {
				calendar.add(Calendar.DAY_OF_MONTH, day);
			} else {
				calendar.add(Calendar.DAY_OF_MONTH, -day);
			}

		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return patten.format(calendar.getTime());

	}

	/**
	 * 获得指定日期的下一天.
	 * @param d 日期
	 * @return yyyy-MM-dd
	 */
	public static String getAfterDay(String d) {
		Calendar calendar = Calendar.getInstance();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date b;
		try {
			b = sdf.parse(d);
			calendar.setTime(b);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		int day = calendar.get(Calendar.DATE);
		calendar.set(Calendar.DATE, day + 1);
		Date date = calendar.getTime();
		return sdf.format(date);
	}


	/**
	 * 获得指定日期的前一天.
	 * @param specifiedDay 日期
	 * @return yyyy-MM-dd
	 */
	public static String getBeforDay(String specifiedDay) {
		Calendar c = Calendar.getInstance();
		Date date = null;
		try {
			date = new SimpleDateFormat("yy-MM-dd").parse(specifiedDay);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		c.setTime(date);
		int day = c.get(Calendar.DATE);
		c.set(Calendar.DATE, day - 1);

		String dayBefore = new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
		return dayBefore;
	}

	/**
	 * 获取该天所在周的周一的日期.
	 * @param t 日期
	 * @return 周一的日期
	 */
	public static String getMonday(String t) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // 设置时间格式
		Date time = null;
		try {
			time = sdf.parse(t);
		} catch (ParseException e) {
			Logger.error("获取该天所在周的周一和周日日期", e);
		}
		Calendar cal = Calendar.getInstance();
		cal.setTime(time);
		// 判断要计算的日期是否是周日，如果是则减一天计算周六的，否则会出问题，计算到下一周去了
		int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天
		if (1 == dayWeek) {
			cal.add(Calendar.DAY_OF_MONTH, -1);
		}
		cal.setFirstDayOfWeek(Calendar.MONDAY); // 设置一个星期的第一天，按中国的习惯一个星期的第一天是星期一
		int day = cal.get(Calendar.DAY_OF_WEEK); // 获得当前日期是一个星期的第几天
		cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);// 根据日历的规则，给当前日期减去星期几与一个星期第一天的差值
		String imptimeBegin = sdf.format(cal.getTime());
		return imptimeBegin;
	}

	/**
	 * 给传入的日期加 day 天.
	 * @param time  日期
	 * @param days 要加的天数
	 * @return 传入日期加 day 天的日期 （String）
	 */
	public static String getAfterDate(String time, int days) {
		SimpleDateFormat sm = new SimpleDateFormat("yyyy-MM-dd");
		Calendar calendar = Calendar.getInstance();
		Date date = new Date();
		try {
			date = sm.parse(time);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		calendar.setTime(date);
		calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + days);
		return sm.format(calendar.getTime());
	}

	/**
	 * 判断当前时间是否在某个时间断内.
	 * @param startTime   日期
	 * @param endTime  日期
	 * @return 是或否
	 */
	public static boolean comparedTimeBig(String startTime, String endTime) {
		SimpleDateFormat formatYMD = new SimpleDateFormat("yyyy-MM-dd HH:mm");// formatYMD表示的是yyyy-MM-dd格式
		Date d1 = null;
		Date d2 = null;
		boolean bool = false;
		try {
			d1 = formatYMD.parse(startTime);
			d2 = formatYMD.parse(endTime);
			if (d1.getTime() <= new Date().getTime() && d2.getTime() >= new Date().getTime()) {
				bool = true;
			}
		} catch (ParseException e) {
			Logger.error("判断时间先后", e);
		}
		return bool;
	}

	/**
	 * 比较当前时间和传入时间.
	 * @param date yyyy-MM-dd HH:mm
	 * @return 是或否
	 */
	public static boolean compareDate(String date) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
		boolean bool = true;
		try {
			Date d = sdf.parse(date);
			if (d.getTime() < new Date().getTime()) {
				bool = false;
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return bool;
	}

	/**
	 * 比较当前时间和传入时间.
	 * @param date yyyy-MM-dd HH:mm
	 * @return 是或否
	 */
	public static boolean compareMonth(String month1, String month2) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
		boolean bool = false;
		try {
			Date d1 = sdf.parse(month1);
			Date d2 = sdf.parse(month2);
			if (d1.before(d2)) {
				bool = true;
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return bool;
	}
}
